package com.portal.portal.config;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.portal.util.StringUtil;

public class DriverRenderConfig {

  private Map<String, DriverPageConfig> pages = new HashMap<String, DriverPageConfig>();

  private String defaultPageId;

  private int orderNumberCounter = 0;

  public Map<String, DriverPageConfig> getPages() {
    return pages;
  }

  public void setPages(Map<String, DriverPageConfig> pages) {
    this.pages = pages;
  }

  public String getDefaultPageId() {
    return defaultPageId;
  }

  public void setDefaultPageId(String defaultPageId) {
    this.defaultPageId = defaultPageId;
  }

  public int getOrderNumberCounter() {
    return orderNumberCounter;
  }

  public void setOrderNumberCounter(int orderNumberCounter) {
    this.orderNumberCounter = orderNumberCounter;
  }

  public void addPage(DriverPageConfig config) {
    config.setOrderNumber(orderNumberCounter++);
    pages.put(config.getName(), config);
  }

  public void removePage(DriverPageConfig config) {
    pages.remove(config.getName());
  }

  public DriverPageConfig getDriverPageConfig(String pageId) {
    if (StringUtil.isNullOrEmpty(pageId)) {
      pageId = defaultPageId;
    }

    DriverPageConfig retval = (DriverPageConfig) pages.get(pageId);

    if (retval == null && pageId.startsWith("/") && pageId.length() > 2) {
      retval = (DriverPageConfig) pages.get(pageId.substring(1));
    }
    if (retval == null) {
      retval = (DriverPageConfig) pages.get(defaultPageId);
    }
    return retval;
  }

  public DriverPageConfig getDefaultPageConfig() {
    return this.getDriverPageConfig(this.getDefaultPageId());
  }

  public List<DriverPageConfig> getAllPages() {
    List<DriverPageConfig> pages = new ArrayList<DriverPageConfig>(this.getPages().values());
    Collections.sort(pages, new Comparator() {
      public int compare(Object a, Object b) {
        DriverPageConfig pa = (DriverPageConfig) a;
        DriverPageConfig pb = (DriverPageConfig) b;
        if (pa.getOrderNumber() > pb.getOrderNumber()) {
          return 1;
        } else if (pa.getOrderNumber() == pb.getOrderNumber()) {
          return 0;
        } else {
          return -1;
        }
      }
    });
    return pages;
  }

}
